home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_08 / 9n08073a < prev    next >
Text File  |  1991-06-20  |  2KB  |  81 lines

  1. //  File cow.h
  2. //////////////////////////////////////////////////////
  3. //  Header for Copy-On-Write base classes
  4.  
  5. #ifndef COW_H             // prevent multiple includes
  6. #define COW_H
  7.  
  8. //  Obj_COW - a real object (for use by virtual objects)
  9. class Obj_COW {
  10.     //  Allow virtual object access to real obj
  11.     friend class Obj_Virt;
  12. protected:
  13.     //  Constructors and destructor
  14.     Obj_COW(void) { count = 0; }
  15.     //  Functions
  16.     virtual Obj_COW *dup(void) = 0;
  17. private:
  18.     //  Data
  19.     short   count;          //  Count of uses
  20. };
  21.  
  22. //  Obj_Virt - a virtual object (points to the real object)
  23. class Obj_Virt {
  24. protected:
  25.     //  Constructors and destructor
  26.     Obj_Virt(void) { po = NULL; }
  27.     Obj_Virt(const Obj_Virt& vo) { set_ptr(vo.po); }
  28.     ~Obj_Virt(void) { release(); }
  29.     //  Functions
  30.     Obj_Virt&   operator = (Obj_Virt& vo)
  31.                   { set_ptr(vo.po); return(*this); }
  32.     Obj_COW     *get_ptr(void) { return(po); }
  33.     void        print(void);
  34.     void        release(void);
  35.     void        set_ptr(Obj_COW *pobj);
  36.     void        split(void);
  37. private:
  38.     //  Data
  39.     Obj_COW *po;            //  Pointer to real object
  40. };
  41.  
  42. //  Obj_Virt::print - print current values
  43. void Obj_Virt::print(void)
  44. {
  45.     printf("po = %p, count = %d\n", po, po->count);
  46. }
  47.  
  48. //  Obj_Virt::release - release the real object
  49. //                      for this virtual object
  50. inline void Obj_Virt::release(void)
  51. {
  52.     if (NULL != po) {
  53.  
  54.         //  Decrement count; delete object if zero
  55.         if (0 == --po->count) {
  56.             delete po;
  57.         }
  58.         po = NULL;
  59.     }
  60. }
  61.  
  62. //  Obj_Virt::set_ptr - do a virtual copy of a real object
  63. inline void Obj_Virt::set_ptr(Obj_COW *pobj)
  64. {
  65.     release();      //  Release current object, if any
  66.     po = pobj;
  67.     po->count++;
  68. }
  69.  
  70. //  Obj_Virt::split - create a new real object if needed
  71. inline void Obj_Virt::split(void)
  72. {
  73.     if (1 < po->count) {    // Only split if count > 1
  74.         po->count--;
  75.         po = po->dup();
  76.         po->count = 1;
  77.     }
  78. }
  79.  
  80. #endif  /* COW_H */
  81.